/******************************************
Probando_Huffman.java
Universidad del Valle de Guatemala
Algoritmos y Estructura de Datos
Autor:
    Martín Guzmán
Fecha: 15 de agosto de 2009
Descripción: 
*******************************************/

import java.lang.reflect.Array;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Random;

public class Probando_Huffman {
    private static int hacer;
    private static Scanner scan = new Scanner(System.in);
    private static Lista_ordenada lista;

    //método main donde empieza la ejecución del programa
    public static void main(String args[])
    {
        System.out.println("\n**************************************************\n");
        System.out.println("               Bienvenido al sistema de\n"+"" +
                           "          construcción de un árbol de Huffman\n");
        System.out.println("**************************************************");

        do
        {
            Menu();
        } while (hacer!=2);//hasta que precione salir
        System.out.println("\n\n¡Gracias por utilizar el programa!");
    }

    //método que despliega el menú para realizar la acción del usuario ****************************
    public static void Menu(){
        do //ciclo hasta que ingrese bien una acción a realizar
        {
            System.out.println("\n\t** Menú Principal **");
            System.out.println("1- Ingresar palabra");
            System.out.println("2- Salir del Programa");
            System.out.print("\t¿Qué desea hacer?\tMarque el número: ");
            //despliega mensaje de error si no escoje una opcion del menu principal
            try{
                hacer=scan.nextInt();
            }
            catch(Exception exp){ //para prevenir el ingreso de algún caracter diferente a número
                System.out.println("\n¡Error accion no válida!\n");
                hacer=-1;
            }
            scan.nextLine();
            if ((hacer<1 || hacer>2) &&(hacer!=-1))
                System.out.println("\n¡Error accion fuera de las opciones!\n");

        } while (hacer<1 || hacer>2);
        System.out.println("\n");
        //para realizar la accion marcada arriba
        switch (hacer)
        {
            case 1://  ********* INGRESAR PALABRA ***********************************************
                //ingresa una palabra para construir el árbol de huffman
                System.out.print(">> Por favor ingrese su palabra: ");
                String palabra;
                palabra= scan.nextLine();
                lista = new Lista_ordenada();

                ArrayList<String> temporal = new ArrayList<String>(); //para meter la palabra en una lista
                for (int i=0;i<palabra.length();i++){
                    temporal.add(palabra.charAt(i)+"");
                }
                // ciclo para crear una lista ordenada de simbolos
                do{
                    String temp=temporal.get(0);//ver la primera letra
                    int contador_frecuencia=0;//contar la frecuencia de la primera letra

                    //System.out.println("Letra: "+temp);//Prueba
                    
                    for(int i=0;i<temporal.size();i++){
                        if(temporal.get(i).compareTo(temp)==0){
                            contador_frecuencia++; //suma 1 a la frecuencia
                            temporal.remove(i); //lo saca de la lista
                            if(temporal.size()==0)
                                break;
                            i--;
                        }
                    }
                    //System.out.println("Enviando símbolo: "+temp+"Frec. "+contador_frecuencia);//Prueba
                    lista.Agregar_a_lista(new Simbolo(temp,contador_frecuencia));
                    //System.out.println("************************\n"+lista.toString()+"****************\n");Prueba
                }while(temporal.size()!=0);

                Arbol_huffman arbol = new Arbol_huffman();
                //System.out.println(lista.getLista().size());//Prueba
                arbol.Generar_arbol(lista);

                //IMPRIMIR LA TABLA
                for (int i=0;i<arbol.getLista_caracteres().size();i++){
                    System.out.println("\tCaracter: "+arbol.getLista_caracteres().get(i).getNombre()+" Frecuencia: "+arbol.getLista_caracteres().get(i).getFrecuencia()+" Código: "+arbol.Obtener_valor(arbol.getLista_caracteres().get(i).getNombre()));
                } 
                break;
        }
    }
}